package com.proyecto.track.action;

import java.util.List;

import org.apache.log4j.Logger;

import com.opensymphony.xwork2.ActionSupport;
import com.proyecto.track.bo.EstadoProyecto;
import com.proyecto.track.bo.Proyecto;
import com.proyecto.track.bo.Usuario;
import com.proyecto.track.service.IProyectoService;

@SuppressWarnings("serial")
public class ProyectoAction extends ActionSupport {

	/** El logger */
	private Logger log = Logger.getLogger(ProyectoAction.class);
	/** El service, inyectado por Spring */
	private IProyectoService proyectoService;
	/** Listado de todos los proyectos */
	private List<Proyecto> proyectos;
	/** El proyecto */
	private Proyecto proyecto;
	/** El combo de estados */
	private List<EstadoProyecto> estadosProyecto;
	/** El combo de usuarios, para seleccionar el responsable */
	private List<Usuario> usuarios;

	/** Auxiliar para los usuarioas asignados */
	private Long[] listadoIdUsuarios;

	private Long horasRestantesProyecto;

	private Long horasTotalesTareas;

	/**
	 * Inicializa los valores necesarios para insertar proyectos al sistema.
	 * 
	 * @return el String que indica el result para struts
	 */
	public String input() {
		log.info(this.getClass().getCanonicalName()
				+ " - inicializando input de proyecto ");
		if (proyecto == null) {
			proyecto = new Proyecto();
		} else if (proyecto.getIdProyecto() != null) {
			proyecto = proyectoService.recuperarProyecto(proyecto
					.getIdProyecto());
		}
		usuarios = proyectoService.getAllUsuarios();
		setEstadosProyecto(proyectoService.listarEstadosProyecto());
		return INPUT;
	}

	/**
	 * Guarda un proyecto
	 * 
	 * @return el String que indica el result para struts
	 */
	public String guardar() {
		log.info(this.getClass().getCanonicalName()
				+ " - llamando a guardar proyecto ");

		proyecto.setResponsable(proyectoService.recuperarUsuario(proyecto
				.getResponsable().getIdUsuario()));
		
		if (proyecto.getIdProyecto() == null) {
			proyectoService.crearProyecto(proyecto);
		} else {
			proyectoService.actualizarProyecto(proyecto);
		}
		return SUCCESS;
	}

	/**
	 * Muestra el detalle de un proyecto
	 * 
	 * @return el String que indica el result para struts
	 */
	public String ver() {
		log.info(this.getClass().getCanonicalName() + "llamando a ver");

		if (proyecto.getIdProyecto() != null) {
			proyecto = proyectoService.recuperarProyecto(proyecto
					.getIdProyecto());
			horasRestantesProyecto = proyecto.recuperarhorasRestantesProyecto();
			horasTotalesTareas = proyecto.recuperarHorasTotalesTareas();
			usuarios = proyectoService.getAllUsuarios();
		}
		return SUCCESS;

	}

	/**
	 * Elimina los proyectos
	 * 
	 * @return el String que indica el result para struts
	 */
	public String borrar() {
		log.info(this.getClass().getCanonicalName() + " - borrando proyecto ");

		if (proyecto.getIdProyecto() != null) {
			proyectoService.borrarProyecto(proyecto.getIdProyecto());
		}
		return SUCCESS;
	}

	/**
	 * Asigna los usuarios considerados como recursos al proyecto
	 * 
	 * @return el String que indica el result para struts
	 */
	public String asignarRecursos() {
		log.info(this.getClass().getCanonicalName()
				+ "llamando a Asignacion de recursos");
		proyecto = proyectoService.recuperarProyecto(proyecto.getIdProyecto());
		proyecto.getRecursosAsignados().clear();
		for (Long idUsuario : listadoIdUsuarios) {
			proyecto.addRecursoAsignado(proyectoService
					.recuperarUsuario(idUsuario));
		}
		proyectoService.actualizarProyecto(proyecto);
		return SUCCESS;
	}

	public void setProyectos(List<Proyecto> proyectos) {
		this.proyectos = proyectos;
	}

	public List<Proyecto> getProyectos() {
		return proyectos;
	}

	public void setProyectoService(IProyectoService proyectoService) {
		this.proyectoService = proyectoService;
	}

	public IProyectoService getProyectoService() {
		return proyectoService;
	}

	public void setProyecto(Proyecto proyecto) {
		this.proyecto = proyecto;
	}

	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setEstadosProyecto(List<EstadoProyecto> estadosProyecto) {
		this.estadosProyecto = estadosProyecto;
	}

	public List<EstadoProyecto> getEstadosProyecto() {
		return estadosProyecto;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setHorasRestantesProyecto(Long horasRestantesProyecto) {
		this.horasRestantesProyecto = horasRestantesProyecto;
	}

	public Long getHorasRestantesProyecto() {
		return horasRestantesProyecto;
	}

	public void setHorasTotalesTareas(Long horasTotalesTareas) {
		this.horasTotalesTareas = horasTotalesTareas;
	}

	public Long getHorasTotalesTareas() {
		return horasTotalesTareas;
	}

	public void setListadoIdUsuarios(Long[] listadoIdUsuarios) {
		this.listadoIdUsuarios = listadoIdUsuarios;
	}

	public Long[] getListadoIdUsuarios() {
		return listadoIdUsuarios;
	}

}
